package com.example.basics.basics_one.iostream;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

//字符流
public class FileReaderWrite {
    public static void main(String[] args) {

    }

    //一个字符一个字符读入
    public static void test01() {
        FileReader fr = null;
        try {
            //1,获取file对象
            File file = new File("src/main/java/.../test.txt");
            System.out.println(file.getAbsoluteFile()); //打印以下路径

            //2,提供具体的流
            //read（）返回读入的一个字符，如果到达文件末尾，返回-1
            int read = fr.read();
            while (read != -1) {
                System.out.println((char) read);
                read = fr.read();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //4 流的关闭
            try {
                if (fr != null) fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //对read（）方法的重载使用
    public static void test02() {
        FileReader fr = null;
        try {
            //1,获取file对象
            File file = new File("src/main/java/.../test.txt");

            //2,提供具体的流
            fr = new FileReader(file);

            //3,数据的读入，这次使用字符数组读入，读完最后还是返回-1
            char[] cbuf = new char[5]; //每次写入5个字符
            int read; //fr,read(cbuf) 返回的就是每次读入的字符数，比如第一次就返回5

            while ((read = fr.read(cbuf)) != -1) {
                for (int i = 0; i < read; i++) {
                    System.out.println(cbuf[1]);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //4,流的关闭
        }
        try {
            if (fr != null) fr.close();

        } catch (Exception e) {
            e.printStackTrace();

        }
    }

    //从内存中写出数据到硬盘的文件里
    //对应的file可以不存在，输出会自动创建文件
    //如果存在，FileWriter(file)  或者FileWriter(file,false) 对原有的文件覆盖，
    //如果是FileWriter(file,true) 是在原有的文件追加内容！
    public static void test03() {
        FileWriter fw = null;

        try {
            //1,获取file对象，指名写出的文件
            File file = new File("src /main/..../test_write.txt");

            //2,提供具体的流
            fw = new FileWriter(file);

            //3，写出的操作（这里就写出字符串）
            fw.write("write String !\n");
            fw.write("write String 2222");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //4,流的关闭
            try {
                if (fw != null) fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    //通过字符流实现文件的复制（读入，写出操作）
    public static void copyFile(){
        FileReader fr = null;
        FileWriter fw = null;
        try{
            //1,获取file对象
            File r_file = new File("ser/main/...../test.text"); //获取读取文件对象
            File w_file = new File("src/main/,,,,,,/test_write.tet");

            //2,提供具体的流
            fr = new FileReader(r_file);
            fw = new FileWriter(w_file);

            //3,读取数据(使用字符数组读入)
            char[] cbuf = new char[5];
            int read; //fr.read(chuf) 返回的就是每次读入的字符数，比如第一次就返回5
            while ((read = fr.read(cbuf)) != -1){
                //4,写入数据
                fw.write(cbuf);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //4 流的关闭
            try {
                if (fr != null) fr.close();
                if (fw != null) fw.close();
            }catch (
                    IOException e
            )
            {
                e.printStackTrace();
            }
        }
    }

}

